Гранью (border, verge, brink) br строки S
называется любой собственный префикс этой строки, равный суффиксу S.
Строка S = abaababaabaab имеет две грани (не
пустые) - ab и abaab. Строка S = abaabaab
также имеет две грани – ab и abaab, но вторая грань –
перекрывающаяся. Строка длины n из
повторяющегося символа, например aaaaaaaa
(или a8), имеет n – 1 грань. Для S = a8 это грани: a, aa,
aaa, aaaa, aaaaa, aaaaaa, aaaaaaa.
Понятие
"собственный префикс" исключает грань, совпадающую с самой строкой.
Длина грани –
это количество символов в ней.
Естественным обобщением
понятия "грань" является понятие "наибольшей грани" – это
наибольший (по количеству символов) собственный префикс строки, равный её
суффиксу.
Вход. Дана строка S (|S| ≤ 106).
Выход. Единственное
число – длина наибольшей грани.
Пример входа |
Пример выхода |
abaabaab |
5 |
строки – префикс-функция
Построим для
строки S в массиве p префикс-функцию. Если длина строки S равна n, то для решения задачи достаточно
вывести значение p[n – 1].
Входная строка s содержит не более MAX = 1000010 символов. Префикс-функцию строим в
массиве p.
#define MAX 1000010
char s[MAX];
int p[MAX];
Строим префикс-функцию
для строки s длины n при помощи функции MaxBorderArray. Выводим длину наибольшей грани строки,
которая находится в p[n – 1].
gets(s); n =
strlen(s);
MaxBorderArray();
printf("%d\n",p[n-1]);